package com.bl.test;

import com.bl.bean.UserInfoBean;
import com.bl.dao.UserInfoBeanMapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.util.*;
import java.io.*;
import java.util.Scanner;

import java.io.InputStream;
import java.util.List;

public class test {


    @Test
    public void test05() {
        // 使用输入流对象加载mybatis的xml配置文件
        InputStream inputStream = test.class.getClassLoader().getResourceAsStream("config-mybatis.xml");
        // 1、构建mybatis的SqlSessionFactory类的实例对象（后期可以反转控制给Spring容器）
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 使用try-with方式释放sqlsession对象：sqlsession的事务不是自动提交的，需要手提交
        try (SqlSession session = sqlSessionFactory.openSession()) {
            // 从sqlsession中获取mapper接口的实现类对象（反射+动态代理）
            UserInfoBeanMapper userInfoBeanMapper = session.getMapper(UserInfoBeanMapper.class);

            // 模拟：查询条件实体类参数
            UserInfoBean userInfoBean = new UserInfoBean();


            userInfoBean.setName("wang");

            // 调用接口的保存方法
            List<UserInfoBean> lstUserinfoBs = userInfoBeanMapper.selectUserInfoByParams(userInfoBean);
            // 输出操作结果
            System.out.println("模糊查询：" + lstUserinfoBs);

            // 手动提交sqlsession的事务，后期由spring通过aop来进行统一管理
            //session.commit(); // 查询操作不需要手动提交事务
        }
    }

    @Test
    public void test04() {   //删除
        //String resource = "org/mybatis/example/mybatis-config.xml";
        // 使用输入流对象加载mybatis的xml配置文件
        InputStream inputStream = test.class.getClassLoader().getResourceAsStream("config-mybatis.xml");
        // 1、构建mybatis的SqlSessionFactory类的实例对象（后期可以反转控制给Spring容器）
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 使用try-with方式释放sqlsession对象：sqlsession的事务不是自动提交的，需要手提交
        try (SqlSession session = sqlSessionFactory.openSession()) {
            // 从sqlsession中获取mapper接口的实现类对象（反射+动态代理）
            UserInfoBeanMapper userInfoBeanMapper = session.getMapper(UserInfoBeanMapper.class);

            // 调用接口的保存方法
            int i = userInfoBeanMapper.deleteByPrimaryKey(5);
            // 输出操作结果
            System.out.println("删除结果：" + i);

            // 手动提交sqlsession的事务，后期由spring通过aop来进行统一管理
            session.commit();
        }
    }

    @Test
    public void test02() {   //修改
        //String resource = "org/mybatis/example/mybatis-config.xml";
        // 使用输入流对象加载mybatis的xml配置文件
        InputStream inputStream = test.class.getClassLoader().getResourceAsStream("config-mybatis.xml");
        // 1、构建mybatis的SqlSessionFactory类的实例对象（后期可以反转控制给Spring容器）
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 使用try-with方式释放sqlsession对象：sqlsession的事务不是自动提交的，需要手提交
        try (SqlSession session = sqlSessionFactory.openSession()) {
            // 从sqlsession中获取mapper接口的实现类对象（反射+动态代理）
            UserInfoBeanMapper userInfoBeanMapper = session.getMapper(UserInfoBeanMapper.class);
            // 通过调用mapper接口的映射文件中的接口方法，来操作数据库：
            // 新增一条记录
            // 创建一个新增的实体类对象：
            UserInfoBean userInfoBean = new UserInfoBean();
            userInfoBean.setId(5);
            System.out.println("请输入名字：");
            Scanner sc = new Scanner(System.in);
            String name = sc.next();
            userInfoBean.setName(name);

            userInfoBean.setPrice("");


            // 调用接口的保存方法
            int i = userInfoBeanMapper.updateByPrimaryKeySelective(userInfoBean);
            // 输出操作结果
            System.out.println("修改结果：" + i);

            // 手动提交sqlsession的事务，后期由spring通过aop来进行统一管理
            session.commit();
        }
    }


    /**
     * 使用mapper接口文件，来进行数据库操作
     */


    @Test
    public void test01() {
        //String resource = "org/mybatis/example/mybatis-config.xml";
        // 使用输入流对象加载mybatis的xml配置文件
        InputStream inputStream = test.class.getClassLoader().getResourceAsStream("config-mybatis.xml");
        // 1、构建mybatis的SqlSessionFactory类的实例对象（后期可以反转控制给Spring容器）
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session2 = sqlSessionFactory.openSession();
        // 2、创建一个sqlsession对象，用户执行mapper映射文件中的查询语句块
        // try-catch 异常处理的with形式,要求写在()中的对象，必须实现 AutoCloseable 接口
        try (SqlSession session = sqlSessionFactory.openSession()) {
            ///3、使用session对象进行数据库查询操作
            /*
            selectByPrimaryKey： 是mybatis框架的mapper映射文件的sql语句块的id
            也就是，session通过id为“selectByPrimaryKey”语句块去进行数据库操作
             */
            for (int i = 1; i < 10; i++) {
                Object obj = session.selectOne("selectByPrimaryKey", i);

                System.out.println("查询结果：" + obj);

            }

        }
    }
}